﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Sistema_Totem.Clases;
using Sistema_Totem.Logica.Comandos;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Logica.Fabricas;
using Sistema_Totem.Logica.Comandos.ComadoProyecto;

namespace Sistema_Totem.Pruebas
{
    [TestFixture]
    public class PruebasProyecto
    {
        #region Grupo Login y Proyecto

        #region Atributos

        private Entidad _proyecto;
        private Comando<bool> _comandoBool;
        private Comando<Entidad> _comandoConsultar;

        #endregion Atributos

        #region Pruebas FabricaEntidad

        #region PruebaInstanciaProyecto

        /// <summary>
        /// Prueba para verificar que la fabrica entidades retorne una instancia correcta
        /// </summary>
        
        [Test]
        public void PruebaInstanciaProyecto()
        {
            _proyecto = (Proyecto)FabricaEntidad.CrearProyecto();
            Assert.IsInstanceOf(typeof(Proyecto), _proyecto);
        }

        #endregion PruebaInstanciaProyecto

        #endregion Pruebas FabricaEntidad

        #region Pruebas FabricaComando

        #region PruebaInstanciaComandoAgregarProyecto

        /// <summary>
        /// Prueba para verificar si la instancia realizada por fabrica 
        /// de comandos retorna un comando para agregar proyecto correcto.
        /// </summary>
        
        [Test]
        public void PruebaInstanciaComandoAgregarProyecto()
        {
            _comandoBool = FabricaComando.CrearComandoAgregarProyecto(_proyecto,(FabricaEntidad.CrearUsuario() as Usuario));
            Assert.IsInstanceOf(typeof(Comando<bool>), _comandoBool);
        }

        #endregion PruebaInstanciaComandoAgregarProyecto

        #region PruebaInstanciaComandoConsultarProyecto

        /// <summary>
        /// Prueba para verificar si la instancia realizada por fabrica 
        /// de comandos retorna un comando para consultar proyecto correcto.
        /// </summary>
        
        [Test]
        public void PruebaInstanciaComandoConsultarProyecto()
        {
            _comandoConsultar = FabricaComando.CrearComandoConsultarProyecto(1);
            Assert.IsInstanceOf(typeof(Comando<Entidad>), _comandoConsultar);
        }

        #endregion PruebaInstanciaComandoConsultarProyecto

        #region PruebaInstanciaComandoModificarProyecto

        /// <summary>
        /// Prueba para verificar si la instancia realizada por fabrica 
        /// de comandos retorna un comando para modificar proyecto correcto.
        /// </summary>
        
        [Test]
        public void PruebaInstanciaComandoModificarProyecto()
        {
            _comandoBool = FabricaComando.CrearComandoModificarProyecto(_proyecto);
            Assert.IsInstanceOf(typeof(Comando<bool>), _comandoBool);
        }

        #endregion PruebaInstanciaComandoModificarProyecto

        #endregion Pruebas FabricaComando

        #region Prueba Agregar Proyecto

        /// <summary>
        /// Prueba realizada para revisar la ejecucion del comando AgregarProyecto
        /// </summary>
        
        [Test]
        public void PruebaAgregarProyecto()
        {
            _proyecto = FabricaEntidad.CrearProyecto();
            (_proyecto as Proyecto).Codigo = "9JSB587";
            (_proyecto as Proyecto).Nombre = "Proyecto de Prueba";
            (_proyecto as Proyecto).FechaIni = DateTime.Today;
            (_proyecto as Proyecto).FechaFin = DateTime.Today;
            (_proyecto as Proyecto).Descripcion = "Este es un proyecto de prueba";
            (_proyecto as Proyecto).Estado = "Activo";
            (_proyecto as Proyecto).Area = "Informatica";
            _comandoBool = FabricaComando.CrearComandoAgregarProyecto(_proyecto,(FabricaEntidad.CrearUsuario() as Usuario));
            Assert.IsTrue(_comandoBool.Ejecutar());
        }

        #endregion Prueba Agregar Proyecto

        #region Prueba Consultar Proyecto

        /// <summary>
        /// Prueba realizada para revisar que el comando ConsultarProyecto
        /// retorne el proyecto asociado al id a buscar.
        /// </summary>
        
        [Test]
        public void PruebaConsultarProyecto()
        {
            _proyecto = FabricaEntidad.CrearProyecto();
            (_proyecto as Proyecto).Nombre = "Totem-Ucab";
            _comandoConsultar = FabricaComando.CrearComandoConsultarProyecto(2);
            Proyecto _proyectoConsultado = (Proyecto)_comandoConsultar.Ejecutar();
            Assert.AreEqual((_proyecto as Proyecto).Nombre, _proyectoConsultado.Nombre);
        }

        #endregion Prueba Consultar Proyecto

        #region Prueba Modificar Proyecto


        /// <summary>
        /// Prueba realizada para revisar la ejecucion del comando ModificarProyecto
        /// </summary> 
        
        [Test]
        public void PruebaModificarProyecto()
        {
            _proyecto = FabricaEntidad.CrearProyecto();
            (_proyecto as Proyecto).Codigo = "9JSB587";
            (_proyecto as Proyecto).Nombre = "Proyecto de Prueba";
            (_proyecto as Proyecto).FechaIni = DateTime.Today;
            (_proyecto as Proyecto).FechaFin = DateTime.Today;
            (_proyecto as Proyecto).Descripcion = "Este es un proyecto de prueba";
            (_proyecto as Proyecto).Estado = "Activo";
            (_proyecto as Proyecto).Area = "Telecomunicaciones";
            (_proyecto as Proyecto).IdProyecto = 5;

            _comandoBool = FabricaComando.CrearComandoModificarProyecto(_proyecto);
            Assert.IsTrue(_comandoBool.Ejecutar());
        }

        #endregion Prueba Modificar Proyecto

        #endregion Grupo Login y Proyecto
    }
}